iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0
自我挑戰組

研究visual studio+MSSQL各項技術系列 第 23

各種存取資料庫的元件介紹(ODBC、OLEDB、SQLClient)、讀取元件介紹(SqlDataReader、SqlDataAdapter)

  • 分享至 

  • xImage
  •  

本回就介紹一下常用的C#存取資料庫的元件,主要ODBC、OLEDB、SQLClient,ODBC的部份有空再補上
但是先說結論,現在的SQLClient比較通用,但未來微軟比較推ODBC。讀取元件的部份,一般而言SqlDataAdapter比較常用到。

ODBC(Open Database Connectivity,開放資料庫互連)ODBC 1.0:發表於1992年9月,提供了一種API作基準,因此有linux ODBC,也有Microsoft ODBC,即使是一種標準,因此這有跨平台版本。ODBC維基連結。以下這個是程式範例:

string connString = @"Driver={ODBC Driver 17 for SQL Server};Server=127.0.0.1,1433;Database=Animal;User Id=YourUsername;Password=YourPassword;";

using (OdbcConnection connection = new OdbcConnection(connString))
{
    connection.Open();
    OdbcCommand command = new OdbcCommand("SELECT * FROM Animal", connection);

    using (OdbcDataReader reader = command.ExecuteReader())
    {
while (reader.Read())
{
    Console.WriteLine(reader["name"].ToString());
}
    }
}

OLEDB(Object Linking and Embedding, Database,對象連結嵌入資料庫,OLEDB)微軟的資料庫連結組件。OLEDB維基連結
以下是OLEDB的範例,可以看到這是用OleDbDataReader讀資料的:

string connString = @"Provider=SQLOLEDB;Data Source=127.0.0.1,1433;Initial Catalog=Animal;User Id=YourUsername;Password=YourPassword";

using (OleDbConnection connection = new OleDbConnection(connString))
{
    connection.Open();
    OleDbCommand command = new OleDbCommand("SELECT [id],[name],[color] FROM [Animal].[dbo].[Animal]", connection);

    using (OleDbDataReader reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
Console.WriteLine(reader["name"].ToString() + reader["color"].ToString());
        }
    }
}

回傳值

狗         黑         
馬         黑         
羊         白    

SQL Server Native Client
這是 Microsoft SQL Server 的一個技術,它是一個獨立的數據訪問 API。它是一種組合了 OLE DB 和 ODBC 的技術,訪問 SQL Server 資料的元件。

以下再加碼說明以下二者的不同:
(一)SqlDataReader
只讀取前進一行的方式讀資料,必須在線讀取資料

(二)SqlDataAdapter
使用DataSet或DataTable,這元件可離線讀資料,也就是說只要用到DataSet或DataTable就一定是SqlDataAdapter,平常用到這元件的機會比較多因為前面提到可以離線讀資料,那也可以自己弄出一個數值用以回傳資料,這個特性有時候會用得到,也支援之前提到的json轉換函式。

DataSet支援同時存取多資料表與合併資料表,缺點就是比較消耗系統資源,DataTable簡單說就是DataSet單資料表的版本。以下是SqlDataAdapter使用dataTable讀資料的程式範例:
以下二例子都是SqlDataAdapter

例一,用LINQ處理後接值

// 連接字串
string connectionString = "Data Source=127.0.0.1,1433;Initial Catalog=Animal;Integrated Security=True";

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    string sqlQuery = "SELECT [id], [name],[color] FROM [Animal].[dbo].[Animal]";

    // 使用 SqlDataAdapter 執行查詢並將結果存入一個 DataTable
    SqlDataAdapter adapter = new SqlDataAdapter(sqlQuery, connection);
    DataTable dataTable = new DataTable();
    adapter.Fill(dataTable);

    // 使用 LINQ 查詢 DataTable
    var query = from row in dataTable.AsEnumerable()
    select new
    {
        id = row.Field<int>("id"),
        name = row.Field<string>("name"),
        color = row.Field<string>("color")
    };

    Console.WriteLine("Query Result:");
    foreach (var result in query)
    {
        Console.WriteLine($"ID: {result.id}, Name: {result.name}, color: {result.color}");
    }
}

回傳值

ID: 1, Name: 狗         , color: 黑         
ID: 2, Name: 馬         , color: 黑         
ID: 3, Name: 羊         , color: 白         

例二,用dataTable接值

string connectionString = "Data Source=127.0.0.1,1433;Initial Catalog=Animal;Integrated Security=True";

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    string sqlQuery = "SELECT [id],[name],[color] FROM [Animal].[dbo].[Animal]";

    // 使用 SqlDataAdapter 執行查詢並將結果存入一個 DataTable
    SqlDataAdapter adapter = new SqlDataAdapter(sqlQuery, connection);
    DataTable dataTable = new DataTable();
    adapter.Fill(dataTable);

    Console.WriteLine("Query Result:");
    for (int i = 0; i < dataTable.Rows.Count; i++)
    {
        Console.WriteLine($"ID: " + dataTable.Rows[i]["name"]);
    }

}

回傳值

Query Result:
ID: 狗         
ID: 馬         
ID: 羊    

以上比較幾種不同的讀取資料的方式,以後在看程式的時候就能比較快看出程式在寫什麼。


上一篇
json與xml程式範例
下一篇
在Visual Studio 2019使用Github備份程式與文件
系列文
研究visual studio+MSSQL各項技術30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言